Spring Boot

David 2022-09-28 23:00:00
Categories: Tags:

<parent>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-parent</artifactId>

<version>2.6.0</version>

  </parent>

 


      <!-- web项目spring相关所有依赖,spring-webspring-mvcaop… -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

 

 

 

执行流程

  1. SpringApplication实例初始化的时候,它会提前做几件事情:
    • 根据classpath里面是否存在 ConfigurableWebApplicationContext 来决定是否应该创建一个为Web应用使用的ApplicationContext类型。
    • 使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationContextInitializer
    • 使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationListener
    • 推断并设置main方法的定义类。

 

  1. 方法执行首先遍历执行所有通过SpringFactoriesLoader可以查找到并加载的SpringApplicationRunListener。调用started()方法

 

  1. 创建并配置当前Spring Boot应用将要使用的Environment(包括配置要使用的PropertySource以及Profile

 

  1. 遍历调用所有SpringApplicationRunListenerenvironmentPrepared()的方法

 

  1. 如果SpringApplicationshowBanner属性被设置为true,则打印banner

 

  1. 根据用户是否明确设置了applicationContextClass类型以及初始化阶段的推断结果,决定该为当前SpringBoot应用创建什么类型的ApplicationContext并创建完成,然后根据条件决定是否添加ShutdownHook,决定是否使用自定义的BeanNameGenerator,决定是否使用自定义的ResourceLoader,当然,最重要的,将之前准备好的Environment设置给创建好的ApplicationContext使用。

 

  1. ApplicationContext创建好之后,SpringApplication会再次借助Spring-FactoriesLoader,查找并加载classpath中所有可用的ApplicationContext-Initializer,然后遍历调用这些ApplicationContextInitializerinitializeapplicationContext)方法来对已经创建好的ApplicationContext进行进一步的处理。

 

  1. 遍历调用所有SpringApplicationRunListenercontextPrepared()方法。

 

  1. 最核心的一步,将之前通过@EnableAutoConfiguration获取的所有配置以及其他形式的IoC容器配置加载到已经准备完毕的ApplicationContext

 

  1. 遍历调用所有SpringApplicationRunListenercontextLoaded()方法。

 

  1. 调用ApplicationContextrefresh()方法,完成IoC容器可用的最后一道工序。

 

  1. 查找当前ApplicationContext中是否注册有CommandLineRunner,如果有,则遍历执行它们。

 

  1. 遍历执行SpringApplicationRunListenerfinished()方法、(如果整个过程出现异常,会将异常信息一并传入处理)

​​​​​​​